package co.gov.medellin.ssti.sub.model.dao.impl;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.LinkedList;
import java.util.List;

import co.gov.medellin.ssti.sub.model.dao.IVflexDAO;
import co.gov.medellin.ssti.sub.model.dao.exception.DAOException;
import co.gov.medellin.ssti.sub.model.vo.ValorFlexibleVO;
import co.gov.medellin.ssti.sub.model.vo.VflexVO;

public class VflexDAOImpl extends BaseDAOImpl implements IVflexDAO {

	public VflexDAOImpl(Connection con) {
		super(con);
	}

	public Collection<VflexVO> findVflex(String nombreTipoVflex)
			throws DAOException {
		PreparedStatement pstmt = null;
		ResultSet rst = null;

		StringBuffer query = new StringBuffer(
				"SELECT VFLEX.CODIGO CODE, VFLEX.CODIGO_VALOR CODIGO_VALOR, "
						+ " VFLEX.NOMBRE NOMBRE_VALOR, VFLEX.DESCRIPCION DESC_VALOR, "
						+ " TVFLEX.CODIGO CODE_TIPO_VFLEX, TVFLEX.NOMBRE NOMBRE_TIPO_VFLEX "
						+ " FROM paoyer.TCS_VALOR_FLEXIBLE VFLEX, paoyer.TCS_TIPO_VALOR_FLEX TVFLEX "
						+ " WHERE TVFLEX.CODIGO = VFLEX.TVF_CODIGO ");
		if (nombreTipoVflex != null) {
			query.append(" AND TVFLEX.NOMBRE LIKE UPPER(?) "
					+ " ORDER BY vflex.descripcion ");

			ArrayList<VflexVO> vflex = new ArrayList<VflexVO>();
			try {
				pstmt = conn.prepareStatement(query.toString());
				pstmt.setString(1, nombreTipoVflex);
				rst = pstmt.executeQuery();

				while (rst.next()) {
					VflexVO valorFlex = new VflexVO();
					valorFlex.setCode(new Long(rst.getLong("CODE")));
					valorFlex.setCodigoVflex(rst.getString("CODIGO_VALOR"));
					valorFlex.setNombreVflex(rst.getString("CODE") + "~"
							+ rst.getString("DESC_VALOR"));
					valorFlex.setDescVflex(rst.getString("DESC_VALOR"));
					valorFlex.setCodigoTipoVflex(new Long(rst
							.getLong("CODE_TIPO_VFLEX")));
					valorFlex.setNombreTipoVflex(rst
							.getString("NOMBRE_TIPO_VFLEX"));
					vflex.add(valorFlex);
				}
				return vflex;
			} catch (SQLException e) {
				throw new DAOException(e);
			} finally {
				close(rst, pstmt);
			}
		} else {
			return null;
		}
	}

	public Collection<VflexVO> findVflex(String nombreTipoVflex,
			String codePadre) throws DAOException {
		PreparedStatement pstmt = null;
		ResultSet rst = null;

		StringBuffer query = new StringBuffer(
				"SELECT VFLEX.CODIGO CODE, VFLEX.CODIGO_VALOR CODIGO_VALOR, "
						+ "VFLEX.NOMBRE NOMBRE_VALOR, VFLEX.DESCRIPCION DESC_VALOR, "
						+ "TVFLEX.CODIGO CODE_TIPO_VFLEX, TVFLEX.NOMBRE NOMBRE_TIPO_VFLEX "
						+ "FROM paoyer.TCS_VALOR_FLEXIBLE VFLEX, paoyer.TCS_TIPO_VALOR_FLEX TVFLEX, paoyer.TCS_VALOR_FLEXIBLE VFLEXPADRE "
						+ "WHERE TVFLEX.CODIGO = VFLEX.TVF_CODIGO "
						+ "AND VFLEX.CAMPO_N1 = VFLEXPADRE.CODIGO ");
		List<Object> parameters = new ArrayList<Object>();

		if (nombreTipoVflex != null && codePadre != null) {
			if (codePadre.equals("18343")) {
				query.append(" AND VFLEX.CAMPO_N1 = ? ");
				parameters.add(codePadre);
			} else {
				query.append(" AND TVFLEX.NOMBRE LIKE ? "
						+ " AND VFLEX.CAMPO_N1 = ? ");
				parameters.add(nombreTipoVflex);
				parameters.add(codePadre);
			}
			query.append(" ORDER BY vflex.descripcion ");

			ArrayList<VflexVO> vflex = new ArrayList<VflexVO>();
			try {
				pstmt = conn.prepareStatement(query.toString());
				pstmt = setQueryParameters(pstmt, parameters);
				rst = pstmt.executeQuery();
				// System.out.println(query.toString());
				// System.out.println("nombreTipoVflex: " + nombreTipoVflex);
				// System.out.println("codePadre: " + codePadre);
				while (rst.next()) {
					VflexVO valorFlex = new VflexVO();
					valorFlex.setCode(new Long(rst.getLong("CODE")));
					valorFlex.setCodigoVflex(rst.getString("CODIGO_VALOR"));
					valorFlex.setNombreVflex(rst.getString("NOMBRE_VALOR"));
					valorFlex.setDescVflex(rst.getString("DESC_VALOR"));
					valorFlex.setCodigoTipoVflex(new Long(rst
							.getLong("CODE_TIPO_VFLEX")));
					valorFlex.setNombreTipoVflex(rst
							.getString("NOMBRE_TIPO_VFLEX"));
					vflex.add(valorFlex);
				}
				return vflex;
			} catch (SQLException e) {
				throw new DAOException(e);
			} finally {
				close(rst, pstmt);
			}

		} else
			return null;
	}

	public Collection<VflexVO> findCodeValorFlex(String strNombre)
			throws DAOException {
		PreparedStatement pstmt = null;
		ResultSet rst = null;

		StringBuffer query = new StringBuffer(
				"SELECT NOMBRE, DESCRIPCION, CODIGO FROM paoyer.TCS_VALOR_FLEXIBLE ");

		if (strNombre != null && !strNombre.equals("")) {
			query.append("WHERE DESCRIPCION LIKE ? ");

			ArrayList<VflexVO> vflex = new ArrayList<VflexVO>();

			try {
				pstmt = conn.prepareStatement(query.toString());
				pstmt.setString(1, strNombre.trim());
				rst = pstmt.executeQuery();

				while (rst.next()) {
					VflexVO valorFlex = new VflexVO();
					valorFlex.setCode(new Long(rst.getLong("CODIGO")));
					valorFlex.setNombreVflex(rst.getString("NOMBRE"));
					valorFlex.setDescVflex(rst.getString("DESCRIPCION"));
					vflex.add(valorFlex);
				}
			} catch (SQLException e) {
				throw new DAOException(e);
			} finally {
				close(rst, pstmt);
			}

			return vflex;
		} else {
			return null;
		}
	}

	public Long findCodePadreByCodeHijo(Long codeHijo) throws DAOException {
		PreparedStatement pstmt = null;
		ResultSet rst = null;

		String query = "SELECT codigo FROM paoyer.tcs_valor_flexible "
				+ " WHERE codigo = "
				+ " ( SELECT campo_n1 FROM paoyer.tcs_valor_flexible WHERE codigo = ? )";

		try {
			pstmt = conn.prepareStatement(query);
			pstmt.setLong(1, codeHijo.longValue());
			rst = pstmt.executeQuery();

			if (rst.next()) {
				return new Long(rst.getLong("codigo"));
			} else {
				return null;
			}
		} catch (SQLException e) {
			throw new DAOException(e);
		} finally {
			close(rst, pstmt);
		}
	}

	public boolean exists(String strNombre, String strCodigo)
			throws DAOException {
		PreparedStatement pstmt = null;
		ResultSet rst = null;

		String query = "SELECT DESCRIPCION FROM paoyer.TCS_VALOR_FLEXIBLE "
				+ " WHERE UPPER(DESCRIPCION) LIKE ? "
				+ " AND UPPER(CODIGO_VALOR) LIKE ? ";

		try {
			pstmt = conn.prepareStatement(query);
			pstmt.setString(1, strNombre.trim().toUpperCase());
			pstmt.setString(2, strCodigo.trim().toUpperCase());
			rst = pstmt.executeQuery();

			if (rst.next()) {
				return true;
			}
		} catch (SQLException e) {
			throw new DAOException(e);
		} finally {
			close(rst, pstmt);
		}

		return false;
	}

	public Collection<ValorFlexibleVO> findDominio(String tipovfl, String option)
			throws DAOException {
		PreparedStatement pstmt = null;
		ResultSet rst = null;

		int dominio = Integer.parseInt(tipovfl.trim());
		List<ValorFlexibleVO> listaDominio = new LinkedList<ValorFlexibleVO>();

		StringBuffer query = new StringBuffer(
				"SELECT TCS_VALOR_FLEXIBLE.CODIGO CODIGOVFL, TCS_TIPO_VALOR_FLEX.CODIGO TVFCOD, "
						+ "TCS_TIPO_VALOR_FLEX.DESCRIPCION TVFDES, TCS_TIPO_VALOR_FLEX.VIGENCIA TVFVIG, "
						+ "TCS_VALOR_FLEXIBLE.DESCRIPCION VFDES, TCS_VALOR_FLEXIBLE.TVF_CODIGO VFTVFCOD "
						+ "FROM paoyer.TCS_TIPO_VALOR_FLEX, paoyer.TCS_VALOR_FLEXIBLE "
						+ "WHERE TCS_TIPO_VALOR_FLEX.CODIGO = ? AND TCS_VALOR_FLEXIBLE.TVF_CODIGO = ? ");

		if (option.equals("1")) {
			query.append(" AND TCS_VALOR_FLEXIBLE.VIGENCIA='S'");
		} else {
			query.append(" AND TCS_VALOR_FLEXIBLE.VIGENCIA='N'");
		}
		query.append(" ORDER BY CODIGOVFL");

		try {
			pstmt = conn.prepareStatement(query.toString());
			pstmt.setInt(1, dominio);
			pstmt.setInt(2, dominio);
			rst = pstmt.executeQuery();

			while (rst.next()) {
				ValorFlexibleVO valorfl = new ValorFlexibleVO();
				valorfl.setCodigotvfl(rst.getString("TVFCOD"));
				valorfl.settVFCodigo(rst.getString("VFTVFCOD"));
				valorfl.setDescripciontvfl(rst.getString("TVFDES"));
				valorfl.setDescripcionvf(rst.getString("VFDES"));
				valorfl.setVigenciatvfl(rst.getString("TVFVIG"));
				valorfl.setCodigovfl(rst.getString("CODIGOVFL"));
				listaDominio.add(valorfl);
				valorfl = null;
			}
		} catch (SQLException e) {
			throw new DAOException(e);
		} finally {
			close(rst, pstmt);
		}
		return listaDominio;
	}

	public int actValorFlex(String strCodVFL) throws DAOException {
		PreparedStatement pstmt = null;

		int iCodvfl = Integer.parseInt(strCodVFL.trim());
		String query = "UPDATE paoyer.TCS_VALOR_FLEXIBLE SET "
				+ "VIGENCIA = 'S' WHERE CODIGO = ? ";
		try {
			pstmt = conn.prepareStatement(query);
			pstmt.setInt(1, iCodvfl);
			return pstmt.executeUpdate();
		} catch (SQLException e) {
			throw new DAOException(e);
		} catch (NumberFormatException e) {
			throw new DAOException("Numero incorrecto: " + strCodVFL);
		} finally {
			close(pstmt);
		}
	}

}
